/*
 * MTF.h
 *
 *  Created on: June 9, 2012
 *      Author: Maine
 */
 
class MTF{
	
	protected:
	
		// Nombre del archivo de entrada
		const char* 	inputFilename;
		
		// Nombre del archivo donde se guardara la salida
		const char* 	outputFilename;
		
		bool 			readingFromFile;

		uInt 			blocksize;
		char*			buffer; 		// Bloque de texto leido de archivo
		vector<uChar> 	vectorChars;	// Este seria el vector Y
	
	public:
	
		void setInputFilename(const char*);
		void setOutputFilename(const char*);
				
};

class MTFCompress : public MTF{
	
	private:
	
		bool imAtFirstBlock;
	
	protected:

		ifstream inputFile;
		OCompressedStream* outputFile;
		
		// Indica cuanto se leyo del archivo hasta el momento
		uInt readSize;
		
		// Indica cuanto se leyo en la ultima lectura del archivo
		uInt lastReadSize;
	
		int getNextBlockOfText(char** text);
		
	public:
	
		// Dos constructores, por si se quiere usar con o sin archivos
		MTFCompress();
		MTFCompress(const char* inputFilename , uInt blockSize);

		// Destructor
		~MTFCompress();
		
		// Aplica MTF a un bloque del archivo de entrada y
		// guarda el resultado en el archivo de output
		int runNextBlock(vector<uChar>* vector);
		
		// Aplica MTF a un texto pasado por parametro
		int runBlock(const char* texto , vector<uChar>* vector);
		
		// Aplica MTF
		int run();
	
};

class MTFDecompress : public MTF{
	
	protected:
	
		// El archivo comprimido es una tira de numeros
		ICompressedStream* inputFile;		
		
		// El archivo descomprimido es un string
		ofstream outputFile;
		
		// Indica cuanto se leyo en la ultima lectura del archivo
		uInt lastReadSize;
		
	public:
		
		// Dos constructores, por si se quiere usar con o sin archivos
		MTFDecompress();
		MTFDecompress(const char* inputFilename);
		
		// Destructor
		~MTFDecompress();
		
		// "Descomprime" un bloque del archivo de entrada y
		// guarda el resultado en el archivo de output
		int runNextBlock( string* texto );
		
		// "Descomprime" un bloque comprimido con MTF
		int runBlock(const char* textoComprimido, string* textoDescomprimido);
		
		// "Descomprime" todo un archivo
		int run();
		
};
